import org.junit.Test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 如何去掉list里重复的数据
 * 四种方法：1、set去重，2、双层循环，3、contains方法,4、Java8中去重操作
 */
public class ListQuChongFuYuanSu {

    //1、采用set集合来做去重
    @Test
    public void test1(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(1);
        list.add(3);
        list.add(4);
        System.out.println(list);
        System.out.println("------------------------------------");
        //上面的list里装的有重复的数据，我要用set来去掉重复
        Set<Integer> set = new HashSet<>(list);
        System.out.println(set);
        System.out.println("------------------------------------");
        //这里的set里的值已经是去掉了重复的了，如果我还想要将原有的list去重复，如下：
        //1、将原来的list集合额数据全部清空
        list.clear();
        //2、将set集合的值放入到list里，因为set里是没有重复的了，这个时候list也就没有重复的了
        list.addAll(set);
        System.out.println(list);
    }

    //2、采用双重循环来做
    @Test
    public void test2(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(1);
        list.add(3);
        list.add(4);
        System.out.println(list);
        System.out.println("---------------------");
        for (int i = 0; i < list.size()-1; i++) {//从第一个数开始，到最后一个数-1次循环
            for (int j = list.size()-1; j >i;j--) {//从最后一个数开始到i+1
                if(list.get(i).equals(list.get(j))){
                    list.remove(j);//这里的remove里的参数j就是角标，通过角标移除数据
                }
            }System.out.println(list);
        }
        System.out.println();
        System.out.println(list);
        System.out.println("-----------------------------");
    }

    /**
     * 3、采用contains()方法来做，一层循环即可解决问题
     * 说明：我需要一个不重复的list，那么我循环你给我的带重复数据的list，只有满足我新的list里不包含重复list里的值的时候，我再把获取的原list的值放的我新的list里，
     * 也就是如果我的新的list有了值，那么我就不向像新的里面添加值了。
     */
    @Test
    public void test3(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(1);
        list.add(3);
        list.add(4);
        System.out.println(list);
        System.out.println("---------------------");
        List<Integer> myList=new ArrayList<Integer>();
        for (int i = 0; i < list.size(); i++) {
            if (!myList.contains(list.get(i))){
                myList.add(list.get(i));
            }
        }
        System.out.println(myList);
    }

    /**
     * 4、Java8中去重操作
     * list.stream().distinct().collect(Collectors.toList());
     */
    @Test
    public void test4(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(1);
        list.add(3);
        list.add(4);
        System.out.println(list);
        System.out.println("---------------------");
        List<Integer> newList = list.stream().distinct().collect(Collectors.toList());
        System.out.println(newList);
    }
}